package com.white.report.framework.write;

import java.util.List;

/**
 * <p>
 * 顶层的抽象统计记录类
 * 封装了一系列记录统计数据需要用到的动作与骨架
 * </p>
 *
 * @author white
 * @since 2021/11/23
 * @param <R> 原始数据存储完毕后,向辅助表（时，日，月）等... 记录数据时传入的入参
 */
public abstract class AbstractReportWriter<T,R> implements ReportWriter<T> {

    @Override
    public void record(T t) {
        //存入主表
        ReportWriterOriginResult<R> result = recordOrigin(t);
        if (!result.isContinueExec()){
            return;
        }
        //获取实现辅助表统计的实现
        List<AuxiliaryReportWriter<T,R>> reportAuxiliaries = getReportAuxiliaries();
        if (reportAuxiliaries != null) {
            //存入辅助表
            reportAuxiliaries.forEach(item -> item.record(t,result.result()));
        }
    }

    /**
     * 存入原始数据表
     * @param t 数据
     * @return 是否存储成功,如果存储失败则不执行下面逻辑
     */
    protected abstract ReportWriterOriginResult<R> recordOrigin(T t);

    /**
     * 获取实现辅助表统计的实现
     */
    protected abstract List<AuxiliaryReportWriter<T,R>> getReportAuxiliaries();
}
